#ifdef BUILD_SERVER

#include "Pilha.hpp"
#include "Jogador.hpp"
#include "Jogo.hpp"
#include <iostream>

using namespace std;
using namespace jogodavelharedes;

int main(int argc, char* argv[]) {

    cout << "Inicializando servidor" << endl;
    
    Pilha* pilha = new Pilha();
    int jogadores = 1;
    
    bool jogoiniciado = false;
    Jogador* jog1 = new Jogador('X');
    Jogador* jog2 = new Jogador('O');
    Jogo* jogo = new Jogo(jog1, jog2);
    //Escutando msg
    unsigned char ch;
    unsigned char* br = 0;
    int i = 0;
    int j = 0;
    int enviou = 0; //Quem enviou a msg
    
    while (true) {

        pilha->le(&ch, 1);

        switch (ch) {

            case 'I':

                //Verifica a posição disponível
                if (jogadores <= 2) {

                    unsigned char* r;
                    if (jogadores == 1) {

                        r = "1";
                    } else {

                        r = "2";
                    }
                    pilha->escreve((enviou == 0?1:0), 1, (unsigned char*) "A");
                    pilha->escreve((enviou == 0?1:0), 1, r);

                    jogadores++;
                    if (jogadores == 3) {

                        jogoiniciado = true;
                    }
                }
                break;

            case 'T':

                pilha->le(br, 2);
                //precisamos de mais 2 bytes
                if (jogoiniciado) {

                    i = br[0] - '0';
                    j = br[1] - '0';
                    if (jogo->ehJogadaValida(i, j)) {

                        jogo->fazerJogada(i, j);
                        //Envia OK para quem enviou e u para outro
                        if (enviou == 0) {

                            pilha->escreve(0, 1, (unsigned char*) "O");
                            //Update
                            pilha->escreve(1, 1, (unsigned char*) "U");
                            pilha->escreve(1, 2, br);
                        } else {

                            pilha->escreve(1, 1, (unsigned char*) "O");
                            //Update
                            pilha->escreve(0, 1, (unsigned char*) "U");
                            pilha->escreve(0, 2, br);
                        }
                    } else {

                        pilha->escreve((enviou == 0
                                        ?1
                                        :0)
                                        ,1
                                        ,(unsigned char*)"E");
                    }
                }
                break;
        }
    }
}

#endif
